﻿using System;
using System.Text.RegularExpressions;
using System.Data;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using NHibernate;
using NHibernate.Cfg;

/// <summary>
/// Summary description for EmpleadoControl
/// </summary>

public class EmpleadoControl
{
    #region Constructor
    public EmpleadoControl()
	{
		//
		// TODO: Add constructor logic here
		//
    }
    #endregion

    #region Metodos Privados
    /// <summary>
    /// Busca e inserta todos los empleados de la bd en una IList
    /// Autor: Equipo # 3
    /// </summary>
    /// <returns> Un IList con todos los empleados de la bd </returns>
    private IList GetEmpleados()
    {
        IList empleados = null;

        try
        {
            ISession session = NHibernateControl.GetCurrentSession();
            ITransaction tx = session.BeginTransaction();

            empleados = session.CreateCriteria(typeof(Empleado)).List();

            session.Flush();
            NHibernateControl.CloseSession();
        }
        catch (TypeInitializationException)
        {
            System.Web.HttpContext.Current.Response.Write("No se pudieron cargar los archivos de conexion");
        }
        catch (TransactionException)
        {
            System.Web.HttpContext.Current.Response.Write("Error al conectarse a la base de datos");
        }
        catch (Exception)
        {
            System.Web.HttpContext.Current.Response.Write("Error no esperado");
        }

        return empleados;
    }
    #endregion

    #region Metodos Publicos
    /// <summary>
    /// Busca cualquier coincidencia del string en todos los empleados
    /// Recibe un string de busqueda
    /// Autor: Equipo # 3
    /// </summary>
    /// <returns> Un IList de empleados coincidentes con el string </returns>
    public IList Buscar(String query)
    {
        IList empleados = this.GetEmpleados();
        IList resultado = new ArrayList();
        query = query.ToLower();

        if (empleados != null)
        {
            foreach (Empleado empleado in empleados)
            {
                if (Regex.IsMatch(empleado.Apellido.ToLower(), "^" + query))
                    resultado.Add(empleado);
                else if (Regex.IsMatch(empleado.Cedula.ToLower(), "^" + query))
                    resultado.Add(empleado);
                else if (Regex.IsMatch(empleado.Nombre.ToLower(), "^" + query))
                    resultado.Add(empleado);
                else if (Regex.IsMatch(empleado.NumeroCuenta.ToLower(), "^" + query))
                    resultado.Add(empleado);
                else if (Regex.IsMatch(empleado.Status.ToString(), "^" + query))
                    resultado.Add(empleado);
                else if (Regex.IsMatch(empleado.Sueldo.ToString(), "^" + query))
                    resultado.Add(empleado);
                else if (Regex.IsMatch(empleado.TipoCuenta.ToLower(), "^" + query))
                    resultado.Add(empleado);
            }
        }

        return resultado;
    }

    /// <summary>
    /// Guarda un empleado si su cedula no existe en el sistema
    /// Recibe un objeto de tipo empleado
    /// Autor: Equipo # 3
    /// </summary>
    /// <returns> true si se inserto el empleado, false si no </returns>
    public bool Guardar(Empleado empleado)
    {
        bool isInserted = true;
        IList empleados = this.GetEmpleados();

        if (empleado != null)
        {
            foreach (Empleado empleadoGuardado in empleados)
            {
                if (empleadoGuardado.Cedula.ToLower().Equals(empleado.Cedula.ToLower()))
                    isInserted = false;
            }
        }

        if ((isInserted) && (empleado != null))
        {
            ISession session = NHibernateControl.GetCurrentSession();
            ITransaction tx = session.BeginTransaction();

            session.Save(empleado);

            tx.Commit();
            NHibernateControl.CloseSession();
        }
        else
            isInserted = false;

        return isInserted;
    }

    /// <summary>
    /// Guarda en la bd las modificaciones hechas a un empleado dado
    /// Recibe un objeto del tipo empleado
    /// Autor: Equipo # 3
    /// </summary>
    /// <returns> true si se realizo la modificacion, false si no </returns>
    public bool Modificar(Empleado empleado)
    {
        try
        {
            ISession session = NHibernateControl.GetCurrentSession();
            ITransaction tx = session.BeginTransaction();

            session.Update(empleado);

            tx.Commit();
            NHibernateControl.CloseSession();
        }
        catch (TypeInitializationException)
        {
            System.Web.HttpContext.Current.Response.Write("No se pudieron cargar los archivos de conexion");
        }
        catch (TransactionException)
        {
            System.Web.HttpContext.Current.Response.Write("Error al conectarse a la base de datos");
        }
        catch (Exception)
        {
            System.Web.HttpContext.Current.Response.Write("Error no esperado");
        }

        return true;
    }
    /// <summary>
    /// Busca todas la propuestas mediante el uso de nhibernate.
    /// 
    /// Autor: Equipo # 1
    /// </summary>
    /// <returns> una lista generica con todas las propuestas </returns>
    public IList<Empleado> recolectarEmpleado()
    {
        ISession session = NHibernateControl.GetCurrentSession();
        return session.CreateCriteria(typeof(Empleado)).List<Empleado>();
        session.Flush();
        NHibernateControl.CloseSession();
    }
    #endregion

    // <summary>
    //Metodo que se encarga de buscar una Empleado de la lista de Empleados segun el codigo
    //que retorna del metodo recolectarEmpleado.(Grupo 5)
    //Parametro de busqueda: String con el CI del Empleado que se desea buscar 
    // </summary>

    public Empleado BuscarEmpleadoCI(String query)
    {

        IList empleados = (IList)this.recolectarEmpleado();
        Empleado resultado = new Empleado();
        foreach (Empleado empleado in empleados)
        {
            if (empleado.Cedula == query)
                resultado = empleado;
        }
        return resultado;
    }

}